/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ajustecurvas.utils;

/**
 *
 * @author João Gabriel QA
 */
public class Gauss {
    private static double fator;
    
    public double[][] gauss(int numeroEquacoes, double[][] matrizEquacoes, double[] matrizResultados){
        //System.out.print("Matriz Inicial\t");
        double[][] resposta;
        //imprimirMatriz(numeroEquacoes, matrizEquacoes, matrizResultados);
        for(int k = 0; k < numeroEquacoes - 1; k++)
        {
            for(int i = k + 1; i < numeroEquacoes; i++)
            {
                fator = matrizEquacoes[i][k] / matrizEquacoes[k][k];
                
                for(int j = k; j < numeroEquacoes; j++)
                {
                    matrizEquacoes[i][j] = matrizEquacoes[i][j] - (fator * matrizEquacoes[k][j]);
                }
                matrizResultados[i] = matrizResultados[i] - (fator * matrizResultados[k]);
                //imprimirMatriz(numeroEquacoes, matrizEquacoes, matrizResultados);
            }
        }
        resposta = criaMatrizAmpliada(matrizEquacoes, matrizResultados);
        return resposta;
    }
    
    private void imprimirMatriz(int numeroEquacoes, double[][] matrizEquacoes, double[] matrizResultados)
    {
        System.out.println("Matriz Nova");
        for(int i = 0; i < numeroEquacoes; i++)
        {
            for(int j = 0; j < numeroEquacoes; j++)
            {
                System.out.print(matrizEquacoes[i][j] + "\t");
            }
            System.out.print(matrizResultados[i]);
            System.out.println();
        }
    }
    
    public double[] pegaValorVariavel(double[][] matrizEquacoes){
        double a, b, c;
        double[] retorno = new double[3];
        
        //System.out.println("[2][2]: " + matrizEquacoes[2][2]);
        //System.out.println("[2][3]: " + matrizEquacoes[2][3]);
        
        a = matrizEquacoes[2][3]/matrizEquacoes[2][2];
        retorno[0] = a;
        //System.out.println("a: " + a);
        //System.out.println("");
        //System.out.println("[1][1]: " + matrizEquacoes[1][1]);
        //System.out.println("[1][2]: " + matrizEquacoes[1][2]);
        //System.out.println("[1][3]: " + matrizEquacoes[1][3]);
        b = (matrizEquacoes[1][3]-(matrizEquacoes[1][2]*a))/matrizEquacoes[1][1];
        //System.out.println("b: " + b);
        retorno[1] = b;
        //System.out.println("");
        //System.out.println("[0][0]: " + matrizEquacoes[0][0]);
        //System.out.println("[0][1]: " + matrizEquacoes[0][1]);
        //System.out.println("[0][2]: " + matrizEquacoes[0][2]);
        //System.out.println("[0][3]: " + matrizEquacoes[0][3]);
        c = (matrizEquacoes[0][3]-(matrizEquacoes[0][2]*a)-(matrizEquacoes[0][1]*b))/matrizEquacoes[0][0];
        //System.out.println("c: " + c);
        retorno[2] = c;
        return retorno;
    }
    
    private double[][] criaMatrizAmpliada(double[][] matriz, double[] vetor){
        int i = 0, j = 0, k = 0;
        double[][] matrizAmpliada = new double[3][4];
        
        while(j < 3){
            while(i < 4){
                if(i < 3){
                    matrizAmpliada[j][i] = matriz[j][i];
                    //i++;
                }else{
                    matrizAmpliada[j][i] = vetor[k];
                    break;
                }
                i++;
            }
            k++;
            j++;
            i = 0;
            //System.out.println("k: " + k + "j: " + j);
        }
        return matrizAmpliada;
    }
}
